#ifndef _TDEAPPORO_
#define _TDEAPPORO_

#include <iostream>
#include "tporo.h"
#include "tvectorporo.h"
using namespace std;

/** \file  tdeapporo.h
 *  \brief Clase que utiliza un vector de poros para representar las utilidades de un Deap.
 *
 *	Autor: Óscar Toledo Ballester, 48666364c.
 *      Autor: Alejandro Serrano Cases, 74364527f
 *	
 * 	Clase que utiliza un vector de poros para representar las utilidades de un Deap y sus caracteristicas.
 */

/** \brief Clase TDeapPoro.
 *
 * Clase que se corresponde con un deap de poros 
 */

class TDeapPoro
{
   /** \brief Operador de muestra
      *
      * Muestra de la forma indicada el deap
      * \param TDeapPoro& Arbol a mostrar
      * \param ostream& Contiene la salida
      * \return ostream& Salida
      */
   friend ostream & operator<<(ostream &,const TDeapPoro &);

   public:
	/** \brief Constructor por defecto
	*
	* Constructor por defecto de la clase TDeapPoro.
	*/
        TDeapPoro();
        /** \brief Constructor de copia
	*
	* Constructor de copia de la clase TDeapPoro.
	* \param TDeapPoro& Poro origen
	*/
        TDeapPoro(const TDeapPoro &);
        /** \brief Destructor
	*
	* Destructor de la clase TDeapPoro.
	*/
        ~TDeapPoro();
        /** \brief Operador asignacion
	*
	* Operador asignacion de la clase TDeapPoro.
	* \param TDeapPoro& Deap origen
	* \return TDeapPoro& El propio objeto (*this)
	*/
        TDeapPoro & operator=(const TDeapPoro &);
        /** \brief Metodo Igualdad
	*
	* Metodo de comparacion de la clase TDeapPoro.
	* \param TDeapPoro& Deap a comparar
	* \return bool Verdadero si son iguales
	*/
        bool operator==(const TDeapPoro &);
        /** \brief Metodo DesIgualdad
	*
	* Metodo de comparacion de la clase TDeapPoro.
	* \param TDeapPoro& Deap a comparar
	* \return bool Verdadero si son diferentes
	*/
        bool operator!=(const TDeapPoro & tdp);
        /** \brief Metodo EsVacio
	*
	* Metodo para comprobar si esta vacio el deap.
	* \return bool Verdadero si es vacio el deap
	*/
        bool EsVacio() const;
        /** \brief Metodo Insertar
	*
	* Metodo de insercion de un poro en un deap
	* \param TPoro& Poro a insertar
	* \return bool Verdadero si inserta
	*/
        bool Insertar(const TPoro &);
        /** \brief Metodo BorrarMax
	*
	* Metodo que borra el poro max de un deap
	* \return bool Verdadero si borra
	*/
        bool BorrarMax();
        /** \brief Metodo BorrarMax
	*
	* Metodo que borra el poro minimo de un deap
	* \return bool Verdadero si borra
	*/
        bool BorrarMin();
        /** \brief Metodo MAX
	*
	* Metodo que devuelve el poro mayor del deap
	* \return TPoro Poro max
	*/
        TPoro Max() const;
        /** \brief Metodo MIN
	*
	* Metodo que devuelve el poro menor del deap
	* \return TPoro Poro min
	*/
        TPoro Min() const;
        /** \brief Metodo Altura
	*
	* Metodo que mide la altura del deap
	* \return int Entero que contiene la altura del deap
	*/
        // Devuelve la altura del deap (la altura de un deap vacío es 0)
        int Altura() const;
        /** \brief Metodo Nodos
	*
	* Metodo que devuelve la cantidad de nodos del deap.
	* \return int Entero que contiene la cantidad de nodos del deap.
	*/
        int Nodos() const;
        /** \brief Inorden Auxiliar
	*
	* Va construyendo el recorrido en el vector
	* \param int& Contador
	*/
        TVectorPoro InordenAux(int)const;
        /** \brief Preorden Auxiliar
	*
	* Va construyendo el recorrido en el vector
	* \param int& Contador
	*/
        TVectorPoro PreordenAux(int)const;
        /** \brief Postorden Auxiliar
	*
	* Va construyendo el recorrido en el vector
	* \param int& Contador
	*/
        TVectorPoro PostordenAux(int)const;
        /** \brief Inorden
	*
	* Devuelve el recorrido inorden del deap
	* \return TVectorPoro Recorrido del deap.
	*/
        TVectorPoro Inorden()const;
        /** \brief Preorden
	*
	* Devuelve el recorrido inorden del deap
	* \return TVectorPoro Recorrido del deap.
	*/
        TVectorPoro Preorden()const;
        /** \brief Postorden
	*
	* Devuelve el recorrido inorden del deap
	* \return TVectorPoro Recorrido del deap.
	*/
        TVectorPoro Postorden()const;
        /** \brief Niveles
	*
	* Devuelve el recorrido inorden del deap
	* \return TVectorPoro Recorrido del deap.
	*/
        TVectorPoro Niveles()const;

   private:
   	/** \brief Vector de Poros
	 *
	 * Contiene el deap de poros
      	*/
        TVectorPoro v;
        /** \brief Entero siguiente
	 *
	 * Siguiente posicion libre.
      	*/
        int posicion;
};


#endif
